/*
 * ULSF Sagittarius IDA
 * Copyright (C) 2012, John Pritchard, all rights reserved.
 * 
 * This program is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see
 * <http://www.gnu.org/licenses/>.
 */
package sagittarius;

import com.badlogic.gdx.graphics.Mesh;

/**
 * Design data visualization interface
 * 
 * <h3>Axes orientation</h3>
 * <table>
 * <tr><th>Axis</th><th>Direction</th></tr>
 * <tr> <td>X+</td> <td>Longitude forward</td></tr>
 * <tr> <td>Y+</td> <td>Span right</td></tr>
 * <tr> <td>Z+</td> <td>Zenith</td></tr>
 * </table>
 * 
 * <h3>Greek parameters</h3>
 * 
 * <p> The greek parameters are employed by {@link
 * HyperbolicSectionWing} for distribution of volume into the span
 * dimension. </p>
 * 
 * @see sagittarius.design.Body
 * @see sagittarius.design.Volume
 * @see sagittarius.design.Section
 */
public interface Visualization
    extends json.Builder
{
    /**
     * Mesh properties
     */
    public final static boolean Static = true;
    public final static boolean Dynamic = false;

    /**
     * Design parameters
     */
    public float get(Field field);
    public float getLength();
    public float getRadius();
    public float getSpan();
    public float getAlpha();
    public float getBeta();
    public float getGamma();
    public float getDelta();
    public float getEpsilon();
    public float getZeta();
    public float getEta();
    public float getTheta();
    public float getIota();
    public float getKappa();
    /**
     * @return Volume configuration (classname)
     */
    public String getVolume();
    /**
     * @return Airfoil class name, e.g. "sagittarius.airfoil.NACA"
     */
    public String getAirfoilConfiguration();
    /**
     * @return Airfoil identifier, e.g. a NACA number as a plain
     * integer number string
     */
    public String getAirfoilIdentifier();
    /**
     * @return Cached mesh
     */
    public Mesh getMesh();
    /**
     * Optional background vertex mesh generation 
     * @see Generator
     */
    public void generate();
    /**
     * Call dispose on mesh and release cache reference
     */
    public void dispose();
    /**
     * Print vertices and normals to command line console
     */
    public void list();
    /**
     * @return Terse instance-unique description suitable for {@link
     * Generator} constructor
     */
    public String toString();
    /**
     * Notify blocking wait for
     * @see Generator
     */
    public void terminal();
    /**
     * @return Vertices available
     */
    public boolean waitfor()
        throws InterruptedException;
}
